/***************************************************************************
 * icmp.h 
 *
 *  Definiciones y cabeceras para el uso de ICMP en las practicas de 
 *  Redes de Comunicaciones 2 de la EPS-UAM
 *
 *  Autor: Manuel Freire, Jose Hernandez
 *
 *  (C) 2006-07 EPS-UAM 
 ***************************************************************************/

#ifndef __ICMP_H
#define __ICMP_H

#include <netinet/in.h>
#include "ip.h"

// funcion de interrupcion que contiene la respuesta a una solicitud echo
typedef int (*pf_notificacion_echo) (BYTE *dir_ip_origen, unsigned int seq,
  unsigned int tamano, BYTE *datos, op_ip *opciones);

#include "callbackMem.h"

// prototipos publicos

/****************************************************************************
 * Inicializa el nivel ICMP; registra un callback apropiado en la capa IP
 *
 * entra: nada
 * sale:
 *   0 si todo bien, -1 en caso de error
 ****************************************************************************/
int icmp_inicializa();

/****************************************************************************
 * Envia una solicitud ICMP-ECHO sobre un datagrama IP a otro host
 *
 * entra:
 *    dir_ip_destino - dirección de destino del datagrama
 *    id - usado para identificar el callback a usar cuando vuelva la respuesta
 *    seq - para cada identificador, se suele ir incrementando para poder
 *      determinar, para cada respuesta, la peticion exacta que la origino
 *    callback - funcion a llamar cuando se reciba una respuesta con el mismo
 *      numero de identificador
 *    tamano - numero de bytes de datos a incluir
 *    datos - bytes de datos a incluir
 *    opciones - opciones a usar/incluir en el datagrama; si se pasa NULL, 
 *          se asumira TTL = 64, TOS = 0, y DF = 1 (ver #defines)
 * sale:
 *    0 si no hay fallos, -1 en caso contrario
 * sale:
 *    0 si no hay fallos, -1 en caso contrario
 ****************************************************************************/
int icmp_envia_echo(BYTE *dir_ip_destino, unsigned int id,
  unsigned int seq, pf_notificacion_echo callback,
  unsigned int tamano, BYTE *datos, op_ip *opciones);

/****************************************************************************
 * Envia un datagrama ICMP usando IP a otro host
 *
 * entra:
 *    dir_ip_destino - dirección de destino del datagrama
 *    tipo - tipo de mensaje de ICMP
 *    codigo - codigo del mensaje
 *    parametros - parametros (4 bytes) a incluir en el mensaje (aquellos
 *          que siguen al checksum en la cabecera ICMP)
 *    tamano - numero de bytes de datos a incluir
 *    datos - bytes de datos a incluir
 *    opciones - opciones a usar/incluir en el datagrama; si se pasa NULL, 
 *          se asumira TTL = 64, TOS = 0, y DF = 1 (ver #defines)
 * sale:
 *    0 si no hay fallos, -1 en caso contrario
 ****************************************************************************/
int icmp_envia_datagrama(BYTE *dir_ip_destino, BYTE tipo, BYTE codigo,
  BYTE *parametros, unsigned int tamano, BYTE *datos, op_ip *opciones);

int icmp_finaliza();


#endif // del #ifndef __ICMP_H
